package storage;

import java.sql.Connection;

import storage.EntityStorage;
import storage.StorageInterface;

public class main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		System.out.println("NTT - TESTING VERSION ");
		System.out.println("ISTRUZIONI");
		System.out.println("***********************************");
		System.out.println("L'out [OK] Come risultato non significa che non si siano verificate Eccezioni,");
		System.out.println("Ma che il sistema si è comportato come atteso.");
		System.out.println("Se viene generata un'eccezione attesa, perché in quelle particolari condizioni il sistema doveva dare errore,");
		System.out.println("allora il risultato sarà ugualmente [OK]\n");
		System.out.println("***********************************\n");
		System.out.println("OPERAZIONE:");
		System.out.println("\tCarico L'interfaccia dello Storage");
		System.out.println("RISULTATO:");
		String response = "[OK]";

		StorageInterface StrInt;

		try {
			StrInt = new StorageInterface();

			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			System.out.println("OPERAZIONE:");
			System.out.println("\tIstanzio una nuova entity di tipo User");
			EntityStorage user = new EntityStorage("User");
			System.out.println("RISULTATO:");
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out.println("\tAvvaloro username=pippo");
			System.out.println("RISULTATO:");
			try {
				user.setAttributeValue("username", "pippo");
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out.println("\tAvvaloro password=pluto");
			System.out.println("RISULTATO:");
			try {
				user.setAttributeValue("password", "pluto");
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out.println("\tAvvaloro mail=pippo@ntt.it");
			System.out.println("RISULTATO:");
			try {
				user.setAttributeValue("mail", "pippo@ntt.it");
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out.println("\tAvvaloro gruppo=admin");
			System.out.println("RISULTATO:");
			try {
				user.setAttributeValue("gruppo", "admin");
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out.println("\tSalvo su database l'utente appena creato");
			System.out.println("RISULTATO:");
			try {
				StrInt.add(user);
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out
					.println("\tModifico lo user appena salvato, mail nuova= gio@ntt.it e poi aggiorno il db");
			System.out.println("RISULTATO:");
			try {
				user.setAttributeValue("mail", "gio@ntt.it");
				StrInt.update(user);
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			// **********************************************************************
			response = "[OK]";

			System.out.println("OPERAZIONE:");
			System.out.println("\tCreo una nuova istanza di user e la carico");
			System.out.println("RISULTATO:");
			try {
				EntityStorage user2 = new EntityStorage("User");
				user2.setAttributeValue("username", "pippo");
				StrInt.load(user2);
				String name[] = user2.getAllNameAttribute();

				for (int i = 0; i < name.length; i++) {
					System.out.println("\t\t" + name[i] + " = "
							+ user2.getAttributeValueToString(name[i]));
				}
			} catch (Exception e) {
				response = "[FAIL]";
				System.out.println(e.getMessage());
			}
			System.out.println(response);
			System.out.println("***********************************");
			/**********************************************************************/
response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out
					.println("\tProvo a settare un valore di un tipo scorretto all'interno di dell'entity User; mail= 54.25");
			System.out.println("RISULTATO:");
			try {
				EntityStorage user2 = new EntityStorage("User");
				Float n = new Float(54.25);
				user2.setAttributeValue("mail", n);
			} catch (Exception e) {
				if (!e.getMessage().equals(
						"Error-Entity-setAttributeValue-InvalidAttributeType")) {
					response = "[FAIL]";
					System.out.println(e.getMessage());
				}
			}
			System.out.println(response);
			System.out.println("***********************************");
			/**********************************************************************/
response = "[OK]";
			System.out.println("OPERAZIONE:");
			System.out
					.println("\tRICHIEDO UN NUMERO DI CONNESSIONI OLTRE IL LIMITE MASSIMO");
			System.out.println("RISULTATO:");
			ConnectionPool pool = new ConnectionPool();
			Object r[] = new Object[11];
			try {

				for (int i = 0; i < 11; i++) {
					r[i] = pool.getConnection();
				}

			} catch (Exception e) {
				for (int i = 0; i < 10; i++) {
					pool.relaseConnection((Connection) r[i]);
				}
				if (!e
						.getMessage()
						.equals(
								"Error-ConnectionPool-getConnection-OverMaxNumberOfConnection")) {
					response = "[FAIL]";
					System.out.println(e.getMessage());
				}
			}
			System.out.println(response);
			System.out.println("***********************************");
			/**********************************************************************/

			System.out.println("OPERAZIONE:");
			System.out
					.println("\tRICHIEDO UN IL MASSIMO DI CONNESSIONI, NE RILASCIO QUALCUNA RICHIEDO NUOVAMENTE IL MASSIMO, NE RILASCIO ALCUNE, NE RICHIEDO OLTRE IL MASSIMO");
			System.out.println("RISULTATO:");
			try {
				// RICHIEDO IL MASSIMO DI CONNESSIONI
				for (int i = 0; i < 10; i++) {
					r[i] = pool.getConnection();
					response = "OK passo 1";
				}

				// NE RILASCIO 5
				for (int i = 0; i < 5; i++) {
					pool.relaseConnection((Connection) r[i]);
					response = "OK passo 2";
				}

				// RICHIEDO IL MASSIMO DI CONNESSIONI
				for (int i = 0; i < 5; i++) {
					r[i] = pool.getConnection();
					response = "OK passo 3";
				}

				// NE RILASCIO 5
				for (int i = 0; i < 5; i++) {
					pool.relaseConnection((Connection) r[i]);
					response = "OK passo 4";
				}

				// RICHIEDO IL MASSIMO DI CONNESSIONI
				for (int i = 0; i < 5; i++) {
					r[i] = pool.getConnection();
					response = "[OK passo 5]";
				}
				// RICHIEDO LA CONNESSIONE OVER
				r[11] = pool.getConnection();

			} catch (Exception e) {
				if (!e
						.getMessage()
						.equals(
								"Error-ConnectionPool-getConnection-OverMaxNumberOfConnection")) {
					response = "[FAIL]";
					System.out.println(e.getMessage());
				}
			}
			System.out.println(response);
			System.out.println("***********************************");
			/**********************************************************************/
		} catch (Exception e) {
			response = "[FAIL]";
			System.out.println(e.getMessage());
		}
	}
}
